/*
 * GeradorCodigo.h
 *
 *  Created on: 13/11/2008
 *      Author: Thiago A. L. Genez
 *              Pedro Sanches Junior
 */

#ifndef GERADORCODIGO_H_
#define GERADORCODIGO_H_

#include "../../Sintatico/IdentificadorGenerico.h"
#include "../../Sintatico/Variavel.h"
#include "../../Sintatico/Parametro.h"
#include "../../Sintatico/ProcedimentoFuncao.h"
#include "../../Sintatico/TabelaHash.h"
#include "../../Sintatico/Tree.h"
#include "../../Sintatico/noTree.h"
#include "../../Sintatico/GerenciarToken.h"
#include "NodeAuxiliar.h"
#include "ListaProcedimentoFuncao.h"
#include "ChamadaProcedimentoFuncao.h"

#include <iomanip>
#include <iostream>
#include <list>
#include <vector>
#include <sstream>

class GeradorCodigo {
public:
	GeradorCodigo();

	/*
	 * public functions
	 */
	bool generateCode(TabelaHash*, Tree*);

	void showCode();
	void setFileOut(char*);

	virtual ~GeradorCodigo();

private:

	/*
	 * attributes
	 */
	TabelaHash *tabelaHash;
	Tree *syntaticTree;
	vector<string> commands;
	vector<string> labels;
	int auxiliarLaco;
	int currentLevel;
	int numberCurrentFunction;

	list<ListaProcedimentoFuncao*> listaProcedimentoFuncao;
	list<ChamadaProcedimentoFuncao*> listaChamadaProcedimentoFuncao;

	/*
	 * private functions
	 */
	string intToString(int);
	string searchProcedureFunction(string, noTree *);

	void generateProgram(noTree*);
	void write(string, string);
	void write(string);
	void setHeaderFileOut(Arquivo *);
	void setNamesInstruction();
	void verificarParametros(noTree*, ListaProcedimentoFuncao*);
	void addInformationExpressionTree(NodeAuxiliar*,noTree*);
	void addInformationStaff(NodeAuxiliar*, ListaProcedimentoFuncao*,int,bool);

	bool isNumber(string);
	bool isBooleano(string);
	bool isOperadorInteger(string);
	bool generateFunctionProcedure(noTree*);
	bool generateCommands(noTree*);
	bool generateIfCommand(noTree*);
	bool generetaWhileCommand(noTree*);
	bool generateReadCommand(noTree*);
	bool generateWriteCommand(noTree*);
	bool generateAttributionComand(noTree*);
	bool generateCallFunctionProcedureCommand(noTree*);
	bool generateExpression(noTree*);
	bool generateNormalExpression(list<string>*, noTree*);
	bool generateExpressionCode(NodeAuxiliar*, noTree *);
	bool isIdentificadorFunctionProcedure(string, noTree *);
	bool isInstruction(string);

	NodeAuxiliar *generateExpressionTree(list<string> *, noTree *);
	NodeAuxiliar *generatePosFixaTree(NodeAuxiliar*);

	list<NodeAuxiliar*> infixaToPosfixa(list<NodeAuxiliar*> );
	list<string> nameInstrucion;
	list<string> brokenString(string);

	int numerateVariables(noTree*);

	Arquivo fileOut;

};

#endif /* GERADORCODIGO_H_ */
